/**
 * 进行axios二次封装：使用请求拦截器和响应拦截器，对请求和响应进行处理
 */
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
// import { localStorage } from '@utils/localStorage'
import useUserStore from '@/store/modules/user'

//创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // api的基础路径
  timeout: 5000, // 请求超时时间
  headers: { 'Content-Type': 'application/json;charset=UTF-8' }, // 设置默认请求头
})

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  (config) => {
    let userStore = useUserStore()
    console.log('token', userStore.token)
    if (userStore.token) {
      config.headers.token = userStore.token //`${localStorage.get('token')}` // `Bearer ${user.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

/**
 *  响应拦截器
 */
service.interceptors.response.use(
  //成功回调，对响应数据进行处理
  (response) => {
    const { code, msg } = response.data
    //console.log(response.data)
    if (code === 200) {
      return response.data
    } else {
      ElMessage({ message: msg || '系统出错', type: 'error' })
      return Promise.reject(new Error(msg || 'Error'))
    }
  },
  //失败回调，对响应错误进行处理(比如处理token失效、超时和http网络错误等)
  (error) => {
    //定义一个变量:存储网络错误信息
    let message = ''
    //http状态码
    let status = error.response?.status
    //根据http状态码判断错误类型
    switch (status) {
      case 400:
        message = '请求错误'
        break
      case 401:
        message = '未授权(或Token过期)，请登录 '
        break
      case 403:
        message = '拒绝访问'
        break
      case 404:
        message = `请求地址出错: ${error.response.config.url}`
        break
      case 408:
        message = '请求超时'
        break
      case 500:
        message = '服务器内部错误'
        break
      case 501:
        message = '服务未实现'
        break
      case 502:
        message = '网关错误'
        break
      case 503:
        message = '服务不可用'
        break
      case 504:
        message = '网关超时'
        break
      case 505:
        message = 'HTTP版本不受支持'
        break
      default:
        message = '网络错误'
    }
    //提示错误信息
    ElMessage({ message: message, type: 'error' })
    return Promise.reject(new Error(message || 'Error'))
    //另外一种判断方法，根据后端实际接口的返回值来判断错误类型
    // const { code, msg } = error.response.data
    // if (code === 401) {
    //   localStorage.clear() //清除浏览器缓存
    //   window.location.href = '/login'
    //   ElMessageBox.alert('登录已过期，请重新登录', '提示', {
    //     confirmButtonText: '重新登录',
    //   })
    // } else if (error.message.includes('timeout')) {
    //   ElMessage.error('请求超时，请稍后再试')
    // } else {
    //   ElMessage.error('请求失败，请检查网络')
    // }
    // return Promise.reject(new Error(msg || 'Error'))
  },
)

//封装get方法
export function get(
  url: string,
  params?: any,
  config?: AxiosRequestConfig,
): Promise<AxiosResponse> {
  return service.get(url, {
    params,
    ...config,
  })
}

//封装post方法
export function post(url: string, data?: any, config?: AxiosRequestConfig): Promise<AxiosResponse> {
  return service.post(url, data, {
    ...config,
  })
}

//封装put方法
export function put(url: string, data?: any, config?: AxiosRequestConfig): Promise<AxiosResponse> {
  return service.put(url, data, {
    ...config,
  })
}

//封装delete方法
export function del(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse> {
  return service.delete(url, {
    ...config,
  })
}

//导出axios实例
export default service
